/*!
 * \file rsgisplugin.h
 * \brief 插件类包含文件
 * \author 张龙星
 * \version 1.00.00
 * \date 2015-08-04
 * \copyright 航天恒星科技有限公司遥感测绘事业部
 * \details 编码文件使用UTF-8编码格式，使用匈牙利命名法，使用doxygen注释样式
 *          类名采用RSGIS开头，动态库抛出标识采用XXXX_EXPORT
 */
#ifndef RSGISPLUGIN_H
#define RSGISPLUGIN_H

#include <QString>

class RSGISInterface;

/*!
 * \brief The RSGISPlugin类是遥感GIS一体化平台插件类，所有实现的插件需要继承该类
 */
class RSGISPlugin
{

public:
    /*!
     * \brief The PLUGINTYPE 枚举是插件类型，包括UI插件、图层插件、渲染插件
     */
    enum PLUGINTYPE
    {
        UI = 1,
        MAPLAYER,
        RENDERER,
    };

public:
    /*!
     * \brief RSGISPlugin 插件类构造函数
     * \param name 插件名称
     * \param description 插件描述信息
     * \param category 插件类别
     * \param version 插件版本
     * \param type 插件类型
     */
    RSGISPlugin( QString const & name = "",
                QString const & description = "",
                QString const & category = "",
                QString const & version = "" ,
                PLUGINTYPE const & type = MAPLAYER)
        : m_Name( name )
        , m_Description( description )
        , m_Category( category )
        , m_Version( version )
        , m_Type( type )
    {}

    /*!
     * \brief ~RSGISPlugin 插件类析构函数
     */
    virtual ~RSGISPlugin()
    {}

    /*!
     * \brief name 获取插件名称
     * \return 插件名称
     */
    QString const & name() const
    {
        return m_Name;
    }

    /*!
     * \brief name 获取插件名称
     * \return 插件名称
     */
    QString       & name()
    {
        return m_Name;
    }

    /*!
     * \brief version 获取插件版本
     * \return 插件版本
     */
    QString const & version() const
    {
        return m_Version;
    }

    /*!
     * \brief version 获取插件版本
     * \return 插件版本
     */
    QString & version()
    {
        return m_Version;
    }

    /*!
     * \brief description 获取插件描述信息
     * \return 插件描述信息
     */
    QString const & description() const
    {
        return m_Description;
    }

    /*!
     * \brief description 获取插件描述信息
     * \return 插件描述信息
     */
    QString       & description()
    {
        return m_Description;
    }

    /*!
     * \brief category 获取插件类别
     * \return 插件类别
     */
    QString const & category() const
    {
        return m_Category;
    }

    /*!
     * \brief category 获取插件类别
     * \return 插件类别
     */
    QString       & category()
    {
        return m_Category;
    }

    /*!
     * \brief type 获取插件类型
     * \return 插件类型
     */
    RSGISPlugin::PLUGINTYPE const & type() const
    {
        return m_Type;
    }


    /*!
     * \brief type 获取插件类型
     * \return 插件类型
     */
    RSGISPlugin::PLUGINTYPE       & type()
    {
        return m_Type;
    }


    /*!
     * \brief initGui 初始化插件界面元素，如添加菜单项
     */
    virtual void initGui() = 0;

    /*!
     * \brief unload 卸载插件界面元素，如去除菜单项
     */
    virtual void unload() = 0;

private:

    /*!
     * \brief m_Name 插件名称
     */
    QString m_Name;

    /*!
     * \brief m_Description 插件描述
     */
    QString m_Description;

    /*!
     * \brief m_Category 插件类别
     */
    QString m_Category;

    /*!
     * \brief m_Version 插件版本
     */
    QString m_Version;

    /*!
     * \brief m_Type 插件类型
     */
    PLUGINTYPE m_Type;
};

// 以下定义可以被APP所用

//! Typedef for the function that returns a generic pointer to a plugin object
/*!
 * \brief create_t 通过接口创建插件
 * \return 插件指针
 */
typedef RSGISPlugin *create_t( RSGISInterface * );

/*!
 * \brief unload_t 卸载插件
 */
typedef void unload_t( RSGISPlugin * );

/*!
 * \brief name_t 获取插件名称
 * \return 插件名称
 */
typedef QString name_t();

/*!
 * \brief description_t 获取插件描述信息
 * \return 插件描述信息
 */
typedef QString description_t();

/*!
 * \brief category_t 获取插件类别
 * \return 插件类别
 */
typedef QString category_t();

/*!
 * \brief type_t 获取插件类型
 * \return 插件类型
 */
typedef int type_t();

/*!
 * \brief version_t 获取插件版本
 * \return 插件版本
 */
typedef QString version_t();

/*!
 * \brief icon_t
 * \return
 */
typedef QString icon_t();

/*!
 * \brief experimental_t
 * \return
 */
typedef QString experimental_t();

#endif // RSGISPLUGIN_H

